package com.pioneer.common.utils;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.pioneer.common.config.CommonConfig;
import com.pioneer.common.exception.CustomException;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Hashtable;

/**
 * 二维码生成器
 *
 * @author wf
 * @date 2023-03-14 14:05:45
 **/
public class CodeUtils {

    private static final int BLACK = 0xFF000000;

    private static final int WHITE = 0xFFFFFFFF;

    /**
     * 生成二维码
     *
     * @param codeId 编号id
     * @return 二维码名称
     * @throws WriterException io异常
     * @throws IOException     io异常
     */
    public static String generateCode(Long codeId) throws WriterException, IOException {
        // 这里是URL，扫描之后就跳转到这个界面
        String text = "https://cloud.jxthz.net/wxCode?codeId=" + codeId;

        int width = 400;
        int height = 400;
        // 二维码图片格式
        String format = "jpg";
        // 设置编码，防止中文乱码
        Hashtable<EncodeHintType, Object> ht = new Hashtable<EncodeHintType, Object>();
        ht.put(EncodeHintType.CHARACTER_SET, "UTF-8");
        // 设置二维码参数(编码内容，编码类型，图片宽度，图片高度,格式)
        BitMatrix bitMatrix = new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, width, height, ht);

        int b_width = bitMatrix.getWidth();
        int b_height = bitMatrix.getHeight();
        // 建立图像缓冲器
        BufferedImage image = new BufferedImage(b_width, b_height, BufferedImage.TYPE_3BYTE_BGR);
        for (int x = 0; x < b_width; x++) {
            for (int y = 0; y < b_height; y++) {
                image.setRGB(x, y, bitMatrix.get(x, y) ? BLACK : WHITE);
            }
        }
        // 上传文件路径
        String filePath = CommonConfig.getUploadPath();
        File outputFile = new File(filePath);
        if (!outputFile.exists()) {
            // 创建文件夹
            boolean mkdir = outputFile.mkdir();
            if (!mkdir) {
                throw new CustomException("创建文件夹" + outputFile + "失败");
            }
        }
        // 重命名
        String fileName = exist(filePath, IdUtil.randomUUID());
        // 生成二维码
        ImageIO.write(image, format, new File(filePath + fileName + "." + format));
        // 二维码的名称
        return fileName;
    }

    /**
     * 判断指定路径下的文件是否存在：存在则自动重复名
     *
     * @param filePath 文件路径
     * @param fileName 文件名
     * @return 新文件名
     */
    private static String exist(String filePath, String fileName) {
        if (FileUtil.exist(filePath + fileName)) {
            // 文件名中最后一个点(.)的位置
            int dot = fileName.lastIndexOf(StrUtil.DOT);
            // 文件名（不含后缀）
            String name = fileName.substring(0, dot);
            // 文件后缀（.txt）
            String suffix = fileName.substring(dot);
            // 重命名
            fileName = name + "(1)" + suffix;
            // 递归判断
            return exist(filePath, fileName);
        }
        return fileName;
    }
}
